<?php

namespace App\Ma;

class BaseData
{
    /**
     * 不区分第几张牌
     */
    const Cards = [
        0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, //万
        0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, //万
        0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, //万
        0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, //万


        0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, //筒
        0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, //筒
        0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, //筒
        0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, //筒

        0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, //条
        0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, //条
        0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, //条
        0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, //条

    ];

    const Cards2 = [
        0x0031, 0x0033, 0x0034, 0x0034, //字牌--东南西北
        0x0031, 0x0033, 0x0034, 0x0034, //字牌--东南西北
        0x0031, 0x0033, 0x0034, 0x0034, //字牌--东南西北
        0x0031, 0x0033, 0x0034, 0x0034, //字牌--东南西北

        0x0041, 0x0042, 0x0043, //三元（箭牌）-- 中发白
        0x0041, 0x0042, 0x0043, //三元（箭牌）-- 中发白
        0x0041, 0x0042, 0x0043, //三元（箭牌）-- 中发白
        0x0041, 0x0042, 0x0043, //三元（箭牌）-- 中发白
    ];

    const Types = ["万", "筒", "条"];
    const ZI_PAI = ['东', '南', '西', '北'];
    const SAN_YUAN = ['中', '发', '白'];
    const Matrix = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0], // 0--万
        [0, 0, 0, 0, 0, 0, 0, 0, 0], // 1--筒
        [0, 0, 0, 0, 0, 0, 0, 0, 0], // 2--条
        [0, 0, 0, 0], // 3--字牌--东南西北
        [0, 0, 0], // 4--三元（箭牌）-- 中发白
        [0], // 5--癞子数量
    ];

    const Matrix2 = [
        [1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0], // 0--万
        [1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0], // 1--筒
        [1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0], // 2--条
        // 东      南      西      北
        [1 => 0, 2 => 0, 3 => 0, 4 => 0], // 3--字牌
        // 中      发      白
        [1 => 0, 2 => 0, 3 => 0], // 4--三元（箭牌）
//        [1 => 0], // 5--癞子数量
    ];

    /**
     * 例：
     * const PAI_DEMO = 0x3026;
     * 表示：第三个6条
     * 第1位：0~4：牌的顺序 5：鬼牌变换而来（痞子玩法时最终存贮值）      PAI_DEMO >> 12
     * 第2位：0：正常 1：鬼牌                                        (PAI_DEMO >> 8) & 0x0f
     * 第3位：self::Matrix 的key值 牌型                              (PAI_DEMO >> 4) & 0x0f
     * 第4位：self::Matrix 的的每一个子项中key值（即：牌值）           PAI_DEMO & 0x0f
     * @param bool $hasZiPai 是否含字、箭牌
     * @param array $laiZi 癞子
     * @return array
     */
    public static function shuffleCards($hasZiPai = true, $laiZi = []): array
    {
        $cards = self::Cards;
        if ($hasZiPai) { // 是否包含字牌
            $cards = array_merge($cards, self::Cards2);
        }
        if (!empty($laiZi)) { // 是否有癞子
            $cards = array_map(function ($item) use ($laiZi) {
                if (in_array($item, $laiZi)) {
                    $item = $item | 0x0100; // 将第二位设为1 即鬼牌
                }
                return $item;
            }, $cards);
        }
        // 打乱顺序
        shuffle($cards);
        return $cards;
    }
}